const fs = require('fs');
const path = require('path');
const getPathInfo = p => path.parse(p);

function autoLoadFile(directory, useSubDirectories = false, extList = ['.js']) {
  const filesList = readFileList(directory, useSubDirectories, extList);
  const res = filesList.map(item => {
    let _path = item.replace(/\\/g, '/').split('/mocks/api')[1]; // 绝对路径转相对路径
    return {
      path: item,
      data: require('./api' + _path), // 必须字符串拼接，直接require变量会报警告
      ...getPathInfo(item)
    };
  });
  return res;
}

/**
 * 递归遍历读取需要的文件
 * @param {*} directory 文件夹名称
 * @param {*} useSubDirectories 是否需要遍历 directory 的子文件夹
 * @param {*} extList 需要找出的文件类型
 * @returns 返回为文件磁盘路径
 */
function readFileList(directory, useSubDirectories, extList) {
  let filesList = [];
  // 获取 directory 文件夹里面的文件名数组，比如 ['login.js']
  const files = fs.readdirSync(directory);
  files.forEach(item => {
    // 获取item的磁盘路径
    const fullPath = path.join(directory, item);
    // fs.statSync是同步方法，返回一个fs.Stats对象，其中包含了诸如文件大小、创建时间、修改时间等详细信息。
    const stat = fs.statSync(fullPath);
    // 若是一个文件夹且需要遍历子项，就递归读取文件
    if (stat.isDirectory() && useSubDirectories) {
      readFileList(path.join(directory, item), useSubDirectories, extList);
    } else {
      // 获取单个文件的信息
      const info = getPathInfo(fullPath);
      // 在寻找的类型里面就push到filesList
      extList.includes(info.ext) && filesList.push(fullPath);
    }
  });
  return filesList;
}

const files = autoLoadFile(path.join(__dirname, './api'), true, ['.js']);
let registerArr = [];
files.map(x => {
  // 只要文件的 export default 部分
  registerArr = registerArr.concat(x.data.default);
});

export default registerArr;
